﻿using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Text;

/// <summary>
/// BasePage
/// </summary>
public class BasePage : System.Web.UI.Page
{
    public BasePage()
    {      
    }

    #region 辅助方法——Alert对话框、获取参数、文本断行

    /// <summary>
    /// 弹出对话框提示。
    /// </summary>
    /// <param name="str"></param>
    public void MsgBox(String str)
    {
        StringBuilder sb = new StringBuilder(str);
        sb.Replace(@"\", @"\\"); //	\  -->	\\
        sb.Replace(@"""", @"\"""); //	"  --> \"
        sb.Replace(@"'", @"\'"); //	'  --> \'
        sb.Replace("\r\n", "\\r\\n");
        sb.Replace("\r", "\\r");
        sb.Replace("\n", "\\n");
        String sScript;
        sScript = "<script>alert(" + "' " + sb.ToString() + " ' " + " );";
        sScript = sScript + "</script> ";

        // 客户端脚本管理
        ClientScriptManager csm = Page.ClientScript;
        string csName = "notpass";
        Type csType = this.GetType();
        if (!csm.IsClientScriptBlockRegistered(csType, csName))
        {
            csm.RegisterClientScriptBlock(this.GetType(), "notpass", sScript);
        }
        //this.Page.RegisterStartupScript("notpass", sScript);
    }

    #endregion

    #region 防刷新重复提交

    /*
		 * 调用方法：
		 *	假设页面上有一个隐藏的TextBox，名称为txtToken，或者ViewState。
		 *	则
		 *		（1）在Page_Load事件完毕之后，调用 txtToken.Text = GetToken();
		 *		（2）在处理提交的事件中，
		 *			try
		 *			{
		 *				if (ValidateToken(txtToken.Text))	//验证通过才进行处理
		 *				{
		 *					//实际的处理……
		 *				}
		 *				else
		 *				{
		 *					//可以加一些提示……
		 *				}
		 *			}
		 *			finally
		 *			{
		 *				txtToken.Text = GetToken();		//确保产生新的Token
		 *			}
		 * 
		 */

    protected override void OnLoad(EventArgs e)
    {
        base.OnLoad(e);

        if (!IsPostBack)
        {
            ViewState["txtToken"] = GetToken();
        }
    }

    /// <summary>
    /// 调用此方法产生一个新的Token，并保存到Session中。
    /// 然后调用方应该将得到的Token同时保存到页面的隐藏字段中。
    /// </summary>
    /// <returns></returns>

    public string GetToken()
    {
        string token = Guid.NewGuid().ToString();
        Session["token"] = token;
        return token;
    }

    public string GetToken4Upload()
    {
        string token = Guid.NewGuid().ToString();
        Session["token2"] = token;
        return token;
    }

    public string GetToken3()
    {
        string token = Guid.NewGuid().ToString();
        Session["token3"] = token;
        return token;
    }

    /// <summary>
    /// 调用方应该从页面的隐藏字段中取出保存的Token，
    /// 调用此方法判断得到的Token是否与Session中的一致。
    /// 若不一致，则表示重复提交。
    /// </summary>
    /// <param name="token"></param>
    /// <returns></returns>
    public bool ValidateToken(string token)
    {
        string savedToken = Session["token"] as String;
        if (savedToken == null)
        {
            return true; //若Session已失效，则默认通过
        }
        return String.Equals(token, savedToken);
    }

    public bool ValidateToken2(string token)
    {
        string savedToken = Session["token2"] as String;
        if (savedToken == null)
        {
            return true; //若Session已失效，则默认通过
        }
        return String.Equals(token, savedToken);
    }

    public bool ValidateToken3(string token)
    {
        string savedToken = Session["token3"] as String;
        if (savedToken == null)
        {
            return true; //若Session已失效，则默认通过
        }
        return String.Equals(token, savedToken);
    }

    #endregion
}
